#include "server_Casillero.h"
#include "server_MaterialFisico.h"
#include "server_Tierra.h"
#include <vector>
#include <cstddef>
#include <iostream>

using std::cout;
using std::endl;
using std::vector;

Casillero::Casillero(){
    material = NULL;
}

Casillero::Casillero(Coordenada coord){
	posicion = coord;
        MaterialFisico* estandar = new Tierra();
        material = estandar;
}	

Casillero::~Casillero(){
    if (material != NULL)
        delete material;
}

Coordenada Casillero::getCoordenada(){
	return posicion;
}

MaterialFisico* Casillero::getMaterial(){
	return material;
}

std::vector<IOcupante*> Casillero::getOcupantes(){
    if (ocupantes.size() == 0) {
        throw "No hay ocupantes";
    }
    return ocupantes;
}

bool Casillero::estaVacio(){
	if (ocupantes.size() == 0){
		return true;
	}
	return false;
}

void Casillero::agregarOcupante(IOcupante* ocupante){
	ocupantes.push_back(ocupante);
}

void Casillero::sacarOcupante(IOcupante* ocupante){
    for(unsigned int i = 0; i < ocupantes.size(); i ++){
            if (ocupantes[i] == ocupante){
                    ocupantes.erase(ocupantes.begin()+i);
            }
    }
}

void Casillero::sacarDesactualizados(){
    for(unsigned int i = 0; i < ocupantes.size(); i++){
        if (!(ocupantes[i]->getPosicion()).esIgual(posicion) || !(ocupantes[i]->getPosicion()).esIgual(posicion)){
            ocupantes.erase(ocupantes.begin()+i);
            i--; //para no afectar al indice actual.
        }
    }
}

void Casillero::setMaterial(MaterialFisico* material) {
    MaterialFisico* aux = NULL;
    if (this->material) {
        if (this->material->serializar() != string("*")) {
            aux = this->material;
            this->material = NULL;
            delete aux;
        }
    }
    this->material = material;
}
